今天要來介紹的是Verilog中的always block~
always block通常用在描述時序邏輯或組合邏輯,這個是他的基本結構:
always @( sensitivity_list )
begin
//一些指令描述
end
在always後的括號內,有一個叫做sensitivity_list的東西,這個列表決定了always會在哪種信號產生變化的時候被觸發且開始執行這塊block。
那在sensitivity_list中,可以包含的信號有:
always @(posedge clk) //clk在riding edge時觸發
begin
if( A == 0 && B == 1 )
C = 0;
else if( A == 1 && B == 0 )
C = 1;
end
always @( a or b or c ) //a,b,c三個輸入訊號其中一個發生變化時觸發
begin
if( A == 0 && B == 1 )
C = 0;
else if( A == 1 && B == 0 )
C = 1;
end
所以只要想好always要在什麼樣的變化下執行、是屬於第一類還是第二類就好了~再把欲執行的指令寫入begin。
always的block有兩種types:
舉個例子:
module newwork(A,B,clk,Q);
input A,B,clk;
output Q;
reg Q;
always @(posedge clk)
begin
if( A == 1 && B == 1 )
Q <= 0; //Non-blocking Assignment
end
endmodule
在這個例子中,如果clock為rising edge,Q值則會在always block結束後改變。
最後就來個練習啦~
module newwork(A,B,clk,Q,W);
input A,B,clk;
output Q,W;
reg Q,W;
wire a,b,c;
always @(posedge clk) //clk為rising edge時觸發
begin
Q <= A & B; //Non-blocking Assignment,結束此block後才生效
end
always @(a | b | c) //a,b,c三者至少有一個訊號的輸入有變化時觸發
begin
W = a & ( c | b ); //程式跑到這行就直接執行,不用等整個block結束
end
endmodule
今天就到這邊~